home *** CD-ROM | disk | FTP | other *** search
- ///////////////////////////////////////////////////////////////////////////////
- // $Id: Event.cxx,v 1.1 1994/02/18 19:49:38 bmott Exp $
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Event.cxx
- //
- // This class maintains a queue of events requested by EventBase derived
- // objects.
- //
- //
- // BSVC "A Microprocessor Simulation Framework"
- // Copyright (c) 1993
- // By: Bradford W. Mott
- // August 11,1993
- //
- ///////////////////////////////////////////////////////////////////////////////
- // $Log: Event.cxx,v $
- // Revision 1.1 1994/02/18 19:49:38 bmott
- // Initial revision
- //
- ///////////////////////////////////////////////////////////////////////////////
-
- #include "Event.hxx"
- #include "Time.hxx"
-
- ///////////////////////////////////////////////////////////////////////////////
- // EventBase Destructor
- ///////////////////////////////////////////////////////////////////////////////
- EventBase::~EventBase()
- {
- // Remove any events in the EventHandler for this object
- event_handler->Remove(this);
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // EventHandler Constructor
- ///////////////////////////////////////////////////////////////////////////////
- EventHandler::EventHandler()
- : list((void *)0),
- iterations(0),
- usec_per_check(20)
- {
- Time time;
-
- old_time=time.seconds();
- }
-
-
- ///////////////////////////////////////////////////////////////////////////////
- // Check for any expired events
- ///////////////////////////////////////////////////////////////////////////////
- void EventHandler::Check()
- {
- long new_time;
- Time time;
-
- ++iterations; // This is another iteration
- new_time=time.seconds(); // Get the current time in seconds
-
- // Check to see if it's time to update usec_per_check
- if(new_time!=old_time)
- {
- usec_per_check=((new_time-old_time)*1000000)/iterations;
- old_time=new_time;
- iterations=0;
- }
-
- // If the list isn't empty
- if(list != (void *)0)
- {
- // Decrement delta_time of the earliest event
- if((list->delta_time -= usec_per_check) <= 0)
- {
- Event *tmp=list;
-
- list=list->next;
- if(list != (void *)0)
- list->delta_time += tmp->delta_time; // In case of some overrun
-
- // This has to be done last because the callback might Add new events :-)
- tmp->Dispatch();
- delete tmp;
- }
- }
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // Add an event to the event list
- ///////////////////////////////////////////////////////////////////////////////
- void EventHandler::Add(EventBase *object, long data, void* pointer, long time)
- {
- Event *event=new Event(object,data,pointer,time);
-
- if(list == (void *)0)
- {
- list=event;
- event->delta_time=time;
- }
- else if(time < list->delta_time)
- {
- event->next = list;
- event->delta_time = time;
- list->delta_time -= time;
- list = event;
- }
- else
- {
- Event *p=list;
- long tmp_delta = list->delta_time;
-
- while(p->next != (void *)0)
- {
- if(time < (tmp_delta + p->next->delta_time) )
- {
- event->delta_time = time-tmp_delta;
- p->next->delta_time -= event->delta_time;
- event->next = p->next;
- p->next = event;
- break;
- }
- else
- {
- p=p->next;
- tmp_delta += p->delta_time;
- }
- }
-
- if(p->next == (void *)0)
- {
- p->next = event;
- event->delta_time = time-tmp_delta;
- }
- }
- }
-
- ///////////////////////////////////////////////////////////////////////////////
- // Remove events for the given object
- ///////////////////////////////////////////////////////////////////////////////
- void EventHandler::Remove(EventBase* object)
- {
- Event *p,*q;
- int done=0;
-
- // Keep looping until no events are deleted
- while(!done)
- {
- done=1;
-
- // Loop through all of the events removing the first one for this object
- for(q=(Event*)0,p=list;p!=(Event*)0;q=p,p=p->next)
- {
- // Check to see if it belongs to object
- if(p->Owner() == object)
- {
- // Delete the event from the event list
- if(q == (Event*)0)
- list=list->next;
- else
- q->next=p->next;
- delete p;
- done=0;
- break;
- }
- }
- }
- }
-
-